10-抽象类 vs 接口:使用场景与对比笔记
1. 抽象类 vs 接口:使用场景与对比笔记
1.1. 🧱 总体原则:"继承复用 vs 行为契约"
用法目的 | 抽象类 | 接口 |
---|---|---|
是为了 "是什么" | ✅ 表示一类事物的本质(继承) | ❌ 不适合 |
是为了 "能做什么" | ❌ 不一定合适 | ✅ 表示行为能力(行为契约) |
1.2. 🔧 抽象类(abstract class)
1.2.1. ✅ 使用场景:
- 表示一类事物的本质,有状态(字段)+ 基础实现逻辑
- 父类模板、代码复用、统一基础行为
- 常用于实体类(如 Person、Product、Shape)
1.2.2. ✅ 特点:
- 可包含成员变量、构造函数、实现方法和抽象方法
- 支持访问修饰符(private/protected/public)
- 支持继承(单继承)
1.2.3. 🧪 示例:
abstract class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
public void eat() {
System.out.println(name + " is eating.");
}
public abstract void speak();
}
1.3. 🧩 接口(interface)
1.3.1. ✅ 使用场景:
-
表示行为能力或角色(如 CanFly、Payable)
-
策略模式、回调机制、模块解耦
-
多实现(类可以实现多个接口)
1.3.2. ✅ 特点:
-
不能有构造函数
-
成员默认 public static final(常量)
-
方法默认 public abstract(除非是 default/static)
-
适用于行为约束、跨系统协作协议定义
1.3.3. 🧪 示例:
interface Payable {
boolean pay(double amount);
}
interface Refundable {
void refund(String orderId);
}
1.4. ✅ 总结对比表
特性 | 抽象类 | 接口 |
---|---|---|
能否实例化 | ❌ 不能 | ❌ 不能 |
是否可以有构造函数 | ✅ 可以 | ❌ 不可以 |
是否可以包含字段 | ✅ 可以(各种访问修饰符) | ⚠️ 只能是常量 public static final |
方法是否可以有实现 | ✅ 可以 | ✅ 可用 default (Java 8+) |
是否支持多继承 | ❌ 不支持(只能单继承) | ✅ 支持(多接口实现) |
1.5. 📌 快速记忆口诀:
抽象类:"我是什么" → 用于继承、统一基础逻辑
接口:"我能做什么" → 用于实现能力、行为扩展